#ifndef _TP1107_APP_H_
#define _TP1107_APP_H_

#include "tp1107_api.h"

#if (_NETWOK_MODLE_TYPE_ == _TP1107_MODULE_) && (_NETWOK_FUNCTION_ENABLE_)

// 版本号字段长度
#define TP1107_NUMBER_OF_VERSION                (10ul)
// 设备序列号字段长度
#define TP1107_NUMBER_OF_SERIAL_NUMBER          (20ul)

/**
 * @brief 报文解析结果
 *
 */
typedef enum
{
  TP1107_EXECUTE_OVER,    // 完毕
  TP1107_EXECUTE_WAIT,    // 等待
  TP1107_EXECUTE_ERROR,   // 错误
  TP1107_EXECUTE_RETRY,   // 重试
  TP1107_EXECUTE_SUCCESS, // 成功
} Tp1107ParsingResults_t;

/**
 * @brief 报文发送步骤
 *
 */
typedef enum
{
  TP1107_SENDINT_IDLE,                     // 发送空闲
  TP1107_GET_LINK_STATUS,                  // 获取链路状态
  TP1107_GET_SERIAL_NUMBER,                // 获取序列号
  TP1107_INTO_COMMAND_MODE,                // 进入命令模式
  TP1107_EXIT_COMMAND_MODE,                // 退出命令模式
  TP1107_GET_VERSION_NUMBER,               // 获取版本号
  TP1107_GET_COMM_FREQUENCIES,             // 获取通信频率
  TP1107_ALL_COMMAND_EXECUTED,             // 所有命令已执行
  TP1107_CONFIG_ADMISSION_MODE,            // 配置入网模式
  TP1107_WAIT_NETWORK_ATTACHMENT,          // 等待网络附着
  TP1107_DEVICE_RESET,                     // 设备复位
  TP1107_FACTORY_RESET,                    // 恢复出厂

  TP1107_CONFIG_SEARCH_TIMEOUT,            // 配置入网超时时间
  TP1107_CONFIG_SEND_TIMEOUT,              // 配置发送超时时间
  TP1107_CONFIG_EMISSION_POWER,            // 配置发射功率
  TP1107_CONFIG_FREQUENCY_RANGE,           // 配置频点
  TP1107_CONFIG_SCAN_FREQUENCY_RANGE,      // 配置频点扫描范围
  TP1107_CONFIG_ADAPTIVE_EMISSION_POWER,   // 配置自适应发射功率
  TP1107_CONFIG_NETWORK_SIGNAL_STRENGTH,   // 配置入网信号强度
  TP1107_CONFIG_AUTO_SCAN_FREQUENCY_RANGE, // 配置自动扫描频点功能
} Tp1107StepsOfSending_t;

/**
 * @brief 硬件属性
 *
 */
typedef struct
{
  int Rssi;                                               // 信号强度
  float UplinkFrequency;                                  // 上行频率
  float DownlinkFrequency;                                // 下行频率
  char VersionNumber[TP1107_NUMBER_OF_VERSION];           // 版本号
  char ModelSerialNumber[TP1107_NUMBER_OF_SERIAL_NUMBER]; // 序列号
} Tp1107HardwareAttributes_t;

/**
 * @brief 状态位
 *
 */
typedef struct
{
  Tp1107StepsOfSending_t StepsOfSending;
} Tp1107BitStatus_t;

/**
 * @brief 通讯初始化
 *
 */
extern void Tp1107CommunicationsInitialization(void);

/**
 * @brief 过滤关键词
 *
 * @param pMessagePacket - 报文
 * @param pMessageSize   - 报文长度
 */
extern void Tp1107FilterKeywords(const uint8_t *pMessagePacket, uint16_t *pMessageSize);

/**
 * @brief 构建自检报文
 *
 * @param pMessageOut      - 构建后的数据
 * @param pSizeOut         - 构建数据长度
 * @param pResponseTimeOut - 命令响应时间
 * @return bool            - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildSelfTestMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint32_t *pResponseTimeOut);

/**
 * @brief 构建设备重置报文
 *
 * @param pMessageOut      - 构建后的数据
 * @param pSizeOut         - 构建数据长度
 * @param pResponseTimeOut - 命令响应时间
 * @return bool            - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildDeviceResetMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint32_t *pResponseTimeOut);

/**
 * @brief 构建网络附着报文
 *
 * @param pMessageOut      - 构建后的数据
 * @param pSizeOut         - 构建数据长度
 * @param pResponseTimeOut - 命令响应时间
 * @return bool            - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildInitiateNetAttachmentMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint32_t *pResponseTimeOut);

/**
 * @brief 构建强制退出命令模式报文
 *
 * @param pMessageOut      - 构建后的数据
 * @param pSizeOut         - 构建数据长度
 * @param pResponseTimeOut - 命令响应时间
 * @return bool            - 构建状态（true：成功 false：失败）
 */
extern bool Tp1107BuildForceExitCommandModeMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint32_t *pResponseTimeOut);

/**
 * @brief 解析接收报文有效性
 *
 * @param pRxMessage    - 接收报文数据流
 * @param MessageLenght - 报文长度
 * @return uint8_t      - 报文类型
 */
extern uint8_t Tp1107ParsingIncomingMessageValidity(const void *pRxMessage, uint16_t MessageLenght);

/**
 * @brief 解析设备自检报文
 *
 * @param pDataIn  - 输入的数据流
 * @return uint8_t - 解析状态
 */
extern uint8_t Tp1107ParsingSelfTestMessage(const void *pDataIn);

/**
 * @brief 解析设备重置报文
 *
 * @param pDataIn  - 输入的数据流
 * @return uint8_t - 解析状态
 */
extern uint8_t Tp1107ParsingDeviceResetMessage(const void *pDataIn);

/**
 * @brief 解析网络附着报文
 *
 * @param pDataIn  - 输入的数据流
 * @return uint8_t - 解析状态
 */
extern uint8_t Tp1107ParsingInitiateNetAttachmentMessage(const void *pDataIn);

/**
 * @brief 解析强制退出命令模式
 *
 * @param pDataIn  - 输入的数据流
 * @return uint8_t - 解析状态
 */
extern uint8_t Tp1107ParsingForceExitCommandModeMessage(const void *pDataIn);

/**
 * @brief 获取通信质量
 *
 * @return uint8_t - 通信质量
 */
extern uint8_t Tp1107GetWirelessQuality(void);

/**
 * @brief 获取固件版本号
 *
 * @param pVersion - 固件版本号
 */
extern void Tp1107GetFirmwareVersionNumber(void *pVersion);

/**
 * @brief 获取设备序列号
 *
 * @param pSerialNumber - 设备序列号
 */
extern void Tp1107GetSerialNumber(void *pSerialNumber);

#endif
#endif
